/*
 * @Author: xia.duanjian
 * @Date: 2022-09-17 09:53:25
 * @LastEditors: xia.duanjian
 * @LastEditTime: 2022-09-18 20:48:12
 * @Description: file content
 */
const path = require('path')
const webpack = require('webpack')
const { defineConfig } = require('@vue/cli-service')
const { GitRevisionPlugin } = require('git-revision-webpack-plugin')
const gitRevisionPlugin = new GitRevisionPlugin()
const CompressionPlugin = require('compression-webpack-plugin')// 引入gzip压缩插件
const themePath = path.join(__dirname, '/src/assets/css/theme.less')
const timeStamp = new Date().getTime()
module.exports = defineConfig({
  transpileDependencies: true,
  // 是否开启eslint保存检测，有效值：ture | false | 'error'
  lintOnSave: process.env.NODE_ENV === 'development',
  // 如果你不需要生产环境的 source map，可以将其设置为 false 以加速生产环境构建。
  productionSourceMap: false,
  chainWebpack: config => {
    config.resolve.alias.set('@', path.join(__dirname, 'src')).set('@api', path.join(__dirname, 'src/api'))
  },
  devServer: {
    // overlay: { // 让浏览器 overlay 同时显示警告和错误
    //   warnings: true,
    //   errors: true
    // },
    client: {
      overlay: true
    },
    host: 'localhost',
    port: 8080, // 端口号
    https: false, // https:{type:Boolean}
    open: true, // 配置自动启动浏览器
    hot: true, // 热更新
    historyApiFallback: true, // 绕过主机检查
    allowedHosts: 'all',
    proxy: { // 配置跨域
      [process.env.VUE_APP_BASE_API]: {
        target: 'http://localhost',
        changeOrigin: true,
        // ws: true,//websocket支持
        secure: false,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''
        }
      }
    }
  },
  css: {
    loaderOptions: {
      less: {
        // 若 less-loader 版本小于 6.0，请移除 lessOptions 这一级，直接配置选项。
        lessOptions: {
          modifyVars: {
            // 直接覆盖变量
            'text-color': '#111',
            'border-color': '#eee',
            // 或者可以通过 less 文件覆盖（文件路径为绝对路径）
            hack: `true; @import "${themePath}";`
          }
        }
      }
    }
  },
  configureWebpack: config => {
    // 开发环境不配置
    // if (process.env.NODE_ENV !== 'production') return
    // 生产环境才去配置
    return {
      plugins: [
        new GitRevisionPlugin({
          commithashCommand: 'rev-list --max-count=1 --no-merges HEAD',
          versionCommand: 'describe --always --tags',
          branchCommand: 'rev-parse --symbolic-full-name HEAD'
        }),
        new webpack.DefinePlugin({
          VERSION: JSON.stringify(gitRevisionPlugin.version()),
          COMMITHASH: JSON.stringify(gitRevisionPlugin.commithash()),
          BRANCH: JSON.stringify(gitRevisionPlugin.branch())
        }),
        new CompressionPlugin({
          filename: '[path][base].gz', //  使得多个.gz文件合并成一个文件，这种方式压缩后的文件少，建议使用
          algorithm: 'gzip', // 官方默认压缩算法也是gzip
          test: /\.js$|\.css$|\.html$|\.ttf$|\.eot$|\.woff$/, // 使用正则给匹配到的文件做压缩，这里是给html、css、js以及字体（.ttf和.woff和.eot）做压缩
          threshold: 10240, // 以字节为单位压缩超过此大小的文件，使用默认值10240吧
          minRatio: 0.8, // 最小压缩比率，官方默认0.8
          // 是否删除原有静态资源文件，即只保留压缩后的.gz文件，建议这个置为false，还保留源文件。以防：
          deleteOriginalAssets: false
        })
      ],
      output: {
        filename: `js[name].${timeStamp}-[git-revision-hash].js`,
        chunkFilename: `js[name].${timeStamp}.js`
      }
      // css: {
      //   extract: process.env.NODE_ENV === 'production'
      //     ? {
      //         filename: `css/[name].${timeStamp}.css`,
      //         chunkFilename: `css/[name].${timeStamp}.css`
      //       }
      //     : false,
      //   sourceMap: true
      // }
    }
  }
})
